package com.huirui.server.service;

import com.huirui.server.pojo.vo.OperationalDataVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

@Service // 若为Spring组件，添加该注解；非Spring环境可去掉
@RequiredArgsConstructor
public class OperationalDataService {

    // 初始化随机数生成器（避免重复创建，提高效率）
    private final Random random = new Random();
    // 日期格式化器（用于生成15天日期列表）
    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("MM-dd");

    public OperationalDataVo getOperationalData() {
        // 1. 生成15天日期列表（以当前日期为终点，向前推14天）
        List<String> dateList = generate15DayDateList();

        // 2. 生成15天销售金额数据（1000~50000元随机，保留2位小数）
        List<BigDecimal> salesAmountsData = generateRandomSalesData(15);

        // 3. 生成15天用户访问量数据（500~5000次随机）
        List<Long> userVisitsData = generateRandomVisitsData(15);

        // 4. 计算昨日/今日核心指标（基于15天数据的最后两位）
        int lastIndex = dateList.size() - 1;
        BigDecimal yesterdaySales = salesAmountsData.get(lastIndex - 1);
        BigDecimal todaySales = salesAmountsData.get(lastIndex);
        Long yesterdayVisits = userVisitsData.get(lastIndex - 1);
        Long todayVisits = userVisitsData.get(lastIndex);

        // 5. 生成订单数（与销售金额正相关：每1000元对应1~2个订单）
        Long yesterdayOrderCount = calculateOrderCount(yesterdaySales);
        Long todayOrderCount = calculateOrderCount(todaySales);

        // 6. 生成会员数（新增会员与访问量正相关：每100次访问对应1~3个新增会员）
        Long yesterdayNewMemberCount = calculateNewMemberCount(yesterdayVisits);
        Long todayNewMemberCount = calculateNewMemberCount(todayVisits);

        // 7. 计算累计指标（总和）
        Long totalOrderCount = yesterdayOrderCount + todayOrderCount + random.nextInt(500); // 历史累计+随机值
        BigDecimal totalSalesAmount = yesterdaySales.add(todaySales).add(generateRandomBigDecimal(100000, 500000)); // 历史累计+随机大额
        Long totalMemberCount = yesterdayNewMemberCount + todayNewMemberCount + random.nextInt(10000); // 历史累计+随机值
        Long totalUserVisits = userVisitsData.stream().mapToLong(Long::longValue).sum() + random.nextInt(50000); // 15天总和+历史累计

        // 构建并返回VO
        return OperationalDataVo
                .builder()
                .updateTime(LocalDateTime.now()) // 当前更新时间
                // 昨日指标
                .yesterdayOrderCount(yesterdayOrderCount)
                .yesterdaySalesAmount(yesterdaySales)
                .yesterdayNewMemberCount(yesterdayNewMemberCount)
                .yesterdayUserVisits(yesterdayVisits)
                // 今日指标
                .todayOrderCount(todayOrderCount)
                .todaySalesAmount(todaySales)
                .todayNewMemberCount(todayNewMemberCount)
                .todayUserVisits(todayVisits)
                // 累计指标
                .totalOrderCount(totalOrderCount)
                .totalSalesAmount(totalSalesAmount)
                .totalMemberCount(totalMemberCount)
                .totalUserVisits(totalUserVisits)
                // 图表数据
                .dateList(dateList)
                .salesAmountsData(salesAmountsData)
                .userVisitsData(userVisitsData)
                .build();
    }

    /**
     * 生成近15天日期列表（格式：MM-dd）
     */
    private List<String> generate15DayDateList() {
        List<String> dateList = new ArrayList<>(15);
        LocalDateTime now = LocalDateTime.now();
        for (int i = 14; i >= 0; i--) { // 从14天前到今天
            LocalDateTime date = now.minusDays(i);
            dateList.add(date.format(DATE_FORMATTER));
        }
        return dateList;
    }

    /**
     * 生成随机销售金额数据（min=1000元，max=50000元）
     */
    private List<BigDecimal> generateRandomSalesData(int size) {
        List<BigDecimal> data = new ArrayList<>(size);
        for (int i = 0; i < size; i++) {
            data.add(generateRandomBigDecimal(1000, 50000));
        }
        return data;
    }

    /**
     * 生成随机访问量数据（min=500，max=5000）
     */
    private List<Long> generateRandomVisitsData(int size) {
        List<Long> data = new ArrayList<>(size);
        for (int i = 0; i < size; i++) {
            long visits = random.nextLong(500, 5001); // Java 17+支持此重载；低版本用 random.nextInt(4501) + 500
            data.add(visits);
        }
        return data;
    }

    /**
     * 生成指定范围的BigDecimal（保留2位小数）
     */
    private BigDecimal generateRandomBigDecimal(int min, int max) {
        double randomValue = min + random.nextDouble() * (max - min);
        return BigDecimal.valueOf(randomValue).setScale(2, RoundingMode.HALF_UP);
    }

    /**
     * 根据销售金额计算订单数（每1000元对应1~2个订单）
     */
    private Long calculateOrderCount(BigDecimal salesAmount) {
        long amount = salesAmount.longValue();
        if (amount < 1000) {
            return random.nextLong(0, 2); // 不足1000元，0~1个订单
        }
        long base = amount / 1000;
        return base + random.nextLong(0, base + 1); // 基础订单数 + 随机增量（0~base）
    }

    /**
     * 根据访问量计算新增会员数（每100次访问对应1~3个会员）
     */
    private Long calculateNewMemberCount(Long visits) {
        if (visits < 100) {
            return random.nextLong(0, 3); // 不足100次访问，0~2个会员
        }
        long base = visits / 100;
        return base + random.nextLong(0, base + 3); // 基础会员数 + 随机增量（0~base+2）
    }
}
